#pragma once
#include <string.h>
#include <string>
#include <ctime>
#include <chrono>
#include <iostream>
#include <vector>

using namespace std;

// 将时间戳转换为 年月日时分秒
string timestampToString(long timestamp);

// 好友信息结构体
struct st_fData
{
    int fid;         // 好友DD号
    string fnick;    // 好友昵称
    string fsex;     // 好友性别
    string phone;    // 手机号
    string email;    // 电子邮箱
    string city;     // 故乡
    string gxqm;     // 个性签名
    string birthday; // 生日
    int status;      // 好友状态 0 离线 1 在线
};

// 用户信息结构体
struct st_userData
{
    int uid;         // 用户DD号
    string pwd;      // 用户密码
    string nick;     // 用户昵称
    string sex;      // 用户性别
    string phone;    // 手机号
    string email;    // 电子邮箱
    string city;     // 故乡
    string gxqm;     // 个性签名
    string birthday; // 生日
    int status;      // 用户状态 0 离线 1 在线
};

// 群聊信息结构体
struct st_gData
{
    int gid;           // 群ID
    string gname;      // 群名称
    int gboss;         // 群主
    string gintroduce; // 群介绍
};

// 群成员信息结构体
struct st_gMemberData
{
    int mid;     // 用户id
    string nick; // 昵称
};

// 在线用户结构体
struct st_onlineUser
{
    st_onlineUser(int num, struct bufferevent *b) : dd_num(num), bev(b) {}
    int dd_num; // DD号
    struct bufferevent *bev;
};

// 用户状态枚举
enum UserType
{
    OFFLINE,
    ONLINE
};

// 消息结构体
struct st_msg
{
    st_msg() {}
    st_msg(int _send, int _recv, int _type, const string &_content) : send(_send), recv(_recv), type(_type), contect(_content)
    {
        // sendtime = time(NULL);    //与下面C++获得的时间戳是一致的
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now().time_since_epoch();
        auto m_timestamp = std::chrono::duration_cast<std::chrono::seconds>(now).count();
        sendtime = timestampToString(m_timestamp);
    }
    int send;        // 发送方
    int recv;        // 接收方
    int type;        // 消息类型
    string contect;  // 消息内容(文本)
    string sendtime; // 发送时间 1970-01-01 00:00:00 到现在的秒数
};

// 动态结构体
struct st_feed
{
    st_feed() {}
    st_feed(int _announcer, const string &_nick, int _type, const string &_content) : announcer(_announcer), nick(_nick), type(_type), contect(_content)
    {
        // sendtime = time(NULL);    //与下面C++获得的时间戳是一致的
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now().time_since_epoch();
        auto m_timestamp = std::chrono::duration_cast<std::chrono::seconds>(now).count();
        feedID = to_string(m_timestamp);
        sendtime = timestampToString(m_timestamp);
    }
    int announcer;   // 发布方
    string nick;     // 昵称
    int type;        // 动态类型
    string contect;  // 动态内容(文本)
    string sendtime; // 发布时间
    string feedID;   // 动态唯一标识
};

// 点赞评论结构体
struct st_dzpl
{
    st_dzpl() {}
    st_dzpl(int _uid, const string &_nick, const string &_feedID, int _type, const string &_content) : uid(_uid), nick(_nick), feedID(_feedID), type(_type), content(_content)
    {
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now().time_since_epoch();
        auto m_timestamp = std::chrono::duration_cast<std::chrono::seconds>(now).count();
        opID = to_string(m_timestamp);
        optime = timestampToString(m_timestamp);
    }
    int uid;        // 用户id
    string nick;    // 用户昵称
    string feedID;  // 动态唯一标识
    int type;       // 操作类型，点赞-1，评论-2
    string content; // 评论内容
    string optime;  // 操作的时间
    string opID;    // 该操作的唯一标识
};

// 群文件结构体
struct st_file
{
    st_file() {}
    st_file(const string &_fid, const string &_fname, long _fsize, const string &_fpath, int _gid, int _uid) : fid(_fid), fname(_fname), fsize(_fsize), fpath(_fpath), gid(_gid), uid(_uid)
    {
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now().time_since_epoch();
        auto m_timestamp = std::chrono::duration_cast<std::chrono::seconds>(now).count();
        upload_time = timestampToString(m_timestamp);
    }
    string fid;         // 文件唯一标识
    string fname;       // 文件名
    long fsize;         // 文件大小
    string fpath;       // 文件路径
    int gid;            // 所属群组
    int uid;            // 上传者
    string upload_time; // 上传时间
};

// 群公告结构体
struct st_gNotice
{
    st_gNotice() {}
    st_gNotice(int _uid, int _gid, const string &_content)
        : uid(_uid), gid(_gid), content(_content)
    {
        // 获取当前时间戳
        auto now = std::chrono::system_clock::now().time_since_epoch();
        auto m_timestamp = std::chrono::duration_cast<std::chrono::seconds>(now).count();
        sendtime = timestampToString(m_timestamp);
    }
    int uid;         // 上传者
    int gid;         // 所属群组
    string content;  // 公告内容
    string sendtime; // 发布时间
};